/*
 * MotorDriver.c
 *
 *  Created on: Dec 5, 2024
 *      Author: admire
 *	本程序电机驱动芯片为L293D，推挽输出，通过定时器4的通道3，4产生PWM波，
 *	PB13(Motor2A)和通道3控制左电机，PB12(Motor4A)和通道4控制右电机，
 *	PA8（EnA）为左电机使能，
 *	PB14(EnB)为右电机使能。
 */
#include "MotorDriver.h"

/**
  * 小车驱动（L293D）初始化函数
  * 参数  	无
  * 返回值 	无
  */
void MotorInition(void)
{
	HAL_GPIO_WritePin(EnA_GPIO_Port, EnA_Pin, 0);	//左电机使能无效，左电机停止
	HAL_GPIO_WritePin(EnB_GPIO_Port, EnB_Pin, 0);	//右电机使能无效，右电机停止
	HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_3);		//启动定时器4的通道3产生PWM波
	HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_4);		//启动定时器4的通道3产生PWM波
}

/**
  * 小车左轮控制函数
  * 参数  	speed:	速度
  * 参数  	flag: 	0：前进；1：后退
  * 返回值 	无
  */
void LeftWheelControl(uint8_t speed,uint8_t angle,bool flag)
{
	  HAL_GPIO_WritePin(EnA_GPIO_Port, EnA_Pin, 1);		//左电机使能有效
	  __HAL_TIM_SET_COMPARE(&htim4,TIM_CHANNEL_3,speed);
	  HAL_GPIO_WritePin(Motor2A_GPIO_Port, Motor2A_Pin, flag);
	  HAL_Delay(angle*60);
	  HAL_GPIO_WritePin(EnA_GPIO_Port, EnA_Pin, 0);		//左电机使能无效
}

/**
  * 小车右轮控制函数
  * 参数  	speed:	速度
  * 参数  	flag: 	0：前进；1：后退
  * 返回值 	无
  */
void RightWheelControl(uint8_t speed,uint8_t angle,bool flag)
{
	  HAL_GPIO_WritePin(EnB_GPIO_Port, EnB_Pin, 1);		//右电机使能有效
	  __HAL_TIM_SET_COMPARE(&htim4,TIM_CHANNEL_4,speed);
	  HAL_GPIO_WritePin(Motor4A_GPIO_Port, Motor4A_Pin, flag);
	  HAL_Delay(angle*60);
	  HAL_GPIO_WritePin(EnB_GPIO_Port, EnB_Pin, 0);		//右电机使能无效
}

/**
  * 小车前进函数
  * 参数  	speed		速度.
  * 参数  	distance	距离
  * 返回值 				无
  */
void CarRun(uint8_t speed,uint32_t distance)
{
	HAL_GPIO_WritePin(EnA_GPIO_Port, EnA_Pin, 1);		//左电机使能有效
	HAL_GPIO_WritePin(EnB_GPIO_Port, EnB_Pin, 1);		//右电机使能有效
	__HAL_TIM_SET_COMPARE(&htim4,TIM_CHANNEL_4,speed);
	__HAL_TIM_SET_COMPARE(&htim4,TIM_CHANNEL_3,speed);
	HAL_GPIO_WritePin(Motor2A_GPIO_Port, Motor2A_Pin, 0);
	HAL_GPIO_WritePin(Motor4A_GPIO_Port, Motor4A_Pin, 0);
	HAL_Delay(distance*20);
	HAL_GPIO_WritePin(EnA_GPIO_Port, EnA_Pin, 0);		//左电机使能无效
	HAL_GPIO_WritePin(EnB_GPIO_Port, EnB_Pin, 0);		//右电机使能无效
}

/**
  * 小车后退函数
  * 参数  	speed		速度.
  * 参数  	distance	距离
  * 返回值 				无
  */
void CarBack(uint8_t speed,uint32_t distance)
{
	HAL_GPIO_WritePin(EnA_GPIO_Port, EnA_Pin, 1);		//左电机使能有效
	HAL_GPIO_WritePin(EnB_GPIO_Port, EnB_Pin, 1);		//右电机使能有效
	__HAL_TIM_SET_COMPARE(&htim4,TIM_CHANNEL_4,100-speed);
	__HAL_TIM_SET_COMPARE(&htim4,TIM_CHANNEL_3,100-speed);
	HAL_GPIO_WritePin(Motor2A_GPIO_Port, Motor2A_Pin, 1);
	HAL_GPIO_WritePin(Motor4A_GPIO_Port, Motor4A_Pin, 1);
	HAL_Delay(distance*20);
	HAL_GPIO_WritePin(EnA_GPIO_Port, EnA_Pin, 0);		//左电机使能无效
	HAL_GPIO_WritePin(EnB_GPIO_Port, EnB_Pin, 0);		//右电机使能无效
}

/**
  * 小车左转函数
  * 参数  	speed		速度.
  * 参数  	angle		角度
  * 返回值 				无
  */
void CarLeft(uint8_t speed,uint32_t angle)
{
	HAL_GPIO_WritePin(EnA_GPIO_Port, EnA_Pin, 1);		//左电机使能有效
	HAL_GPIO_WritePin(EnB_GPIO_Port, EnB_Pin, 1);		//右电机使能有效
	__HAL_TIM_SET_COMPARE(&htim4,TIM_CHANNEL_4,speed);
	__HAL_TIM_SET_COMPARE(&htim4,TIM_CHANNEL_3,speed);
	HAL_GPIO_WritePin(Motor2A_GPIO_Port, Motor2A_Pin, 1);
	HAL_GPIO_WritePin(Motor4A_GPIO_Port, Motor4A_Pin, 0);
	HAL_Delay(angle*6);
	HAL_GPIO_WritePin(EnA_GPIO_Port, EnA_Pin, 0);		//左电机使能无效
	HAL_GPIO_WritePin(EnB_GPIO_Port, EnB_Pin, 0);		//右电机使能无效
}

/**
  * 小车右转函数
  * 参数  	speed		速度.
  * 参数  	angle		角度
  * 返回值 				无
  */
void CarRight(uint8_t speed,uint32_t angle)
{
	HAL_GPIO_WritePin(EnA_GPIO_Port, EnA_Pin, 1);		//左电机使能有效
	HAL_GPIO_WritePin(EnB_GPIO_Port, EnB_Pin, 1);		//右电机使能有效
	__HAL_TIM_SET_COMPARE(&htim4,TIM_CHANNEL_4,100-speed);
	__HAL_TIM_SET_COMPARE(&htim4,TIM_CHANNEL_3,100-speed);
	HAL_GPIO_WritePin(Motor2A_GPIO_Port, Motor2A_Pin, 0);
	HAL_GPIO_WritePin(Motor4A_GPIO_Port, Motor4A_Pin, 1);
	HAL_Delay(angle*6);
	HAL_GPIO_WritePin(EnA_GPIO_Port, EnA_Pin, 0);		//左电机使能无效
	HAL_GPIO_WritePin(EnB_GPIO_Port, EnB_Pin, 0);		//右电机使能无效
}
